In [76]:
from SPARQLWrapper import SPARQLWrapper, JSON
import time, numpy as n
In [262]:
PREFIX="""PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX ops: <http://purl.org/socialparticipation/ops#>
PREFIX opa: <http://purl.org/socialparticipation/opa#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX dc: <http://purl.org/dc/terms/>
PREFIX tsioc: <http://rdfs.org/sioc/types#>
PREFIX schema: <http://schema.org/>"""
In [10]:
NOW=time.time()
q="SELECT ?comentario ?titulo ?texto WHERE \
{?comentario dc:type tsioc:Comment.\
OPTIONAL {?comentario dc:title ?titulo . }\
OPTIONAL {?comentario schema:text ?texto .}}"
sparql3 = SPARQLWrapper("http://localhost:82/participabr/query")
sparql3.setQuery(PREFIX+q)
sparql3.setReturnFormat(JSON)
results4 = sparql3.query().convert()
print("%.2f segundos para puxar todos os comentários do Participa.br"%(time.time()-NOW,))
In [288]:
# fazendo seleção das mensagens com palavras maiores e limiar mínimo de palavras
msgs_=results4["results"]["bindings"]
#msgs=[mm for mm in msgs_ if ("titulo" not in mm.keys()) or ("teste de stress" not in mm["titulo"]["value"].lower())]
msgs=[mm for mm in msgs_ if ("titulo" not in mm.keys()) or (("teste de stress" not in mm["titulo"]["value"].lower())
and ("comunidade de desenvolvedores e nesse caso, quanto mais" not in mm["texto"]["value"].lower()))]
exclude = set(string.punctuation+u'\u201c'+u'\u2018'+u'\u201d'+u'\u2022'+u'\u2013')
def atributos(__msg):
texto=__msg["texto"]["value"]
texto_ = ''.join(ch for ch in texto if ch not in exclude)
palavras=texto_.split()
tams=[]
for palavra in palavras:
tams.append(len(palavra))
return len(tams), n.mean(tams), n.std(tams)
In [289]:
atrs=[]
for msg in msgs:
atrs.append(atributos(msg))
In [290]:
atrs_=n.array(atrs)
In [291]:
max_palavras=115
min_palavras=110
n_msgs=((atrs_[:,0]>min_palavras)*(atrs_[:,0]<max_palavras)).sum()
print(u"são %i mensagens com mais de %i palavras e menos de %i"%
(n_msgs, min_palavras, max_palavras) )
In [292]:
msgs_i=((atrs_[:,0]>min_palavras)*(atrs_[:,0]<max_palavras)).nonzero()[0]
In [293]:
textos=[[msgs[i]["texto"]["value"] for i in msgs_i][j]
for j in (atrs_[msgs_i][:,1]>6.).nonzero()[0]]
for texto in textos: print texto+"\n======="
In [294]:
textos=[[msgs[i]["texto"]["value"] for i in msgs_i.nonzero()[0]][j]
for j in (atrs_[msgs_i][:,1]<5.).nonzero()[0]]
for texto in textos: print texto+"\n======="
In [295]:
atrs_[:,0].shape
Out[295]:
In [306]:
import pylab as p
foo=
p.hist(atrs_[:,0],100, log=True)p.hist(atrs_[:,0],100, log=True)
In [241]:
#dados lidos, processando
NOW=time.time()
import string, nltk as k
# histograma com as palavras
#msgs_=results4["results"]["bindings"]
#msgs=[mm for mm in msgs_ if ("titulo" not in mm.keys()) or ("teste de stress" not in mm["titulo"]["value"].lower())]
palavras=string.join([i["texto"]["value"].lower() for i in msgs])
exclude = set(string.punctuation+u'\u201c'+u'\u2018'+u'\u201d'+u'\u2022'+u'\u2013')
palavras = ''.join(ch for ch in palavras if ch not in exclude)
palavras_=palavras.split()
#fdist=k.FreqDist(palavras_)
print(u"feita lista de todas as palavras de todos os comentários em %.2f"%(time.time()-NOW,))
In [242]:
NOW=time.time()
stopwords = set(k.corpus.stopwords.words('portuguese'))
palavras__=[pp for pp in palavras_ if pp not in stopwords]
fdist_=k.FreqDist(palavras__)
print("retiradas stopwords feita contagem das palavras em %.2f"%(time.time()-NOW,))
In [243]:
for fd,ii in [(fdist_[i],i) for i in fdist_.keys()[:20]]: print fd, ii
In [245]:
for fd,ii in [(fdist_[i],i) for i in fdist_.keys()[20:40]]: print fd, ii
In [246]:
len(fdist_)
Out[246]:
In [247]:
# faz feture vector com elas.
# escolhendo as 200 palavras mais frequentes
palavras_escolhidas=fdist_.keys()[:200]
# outras features que podemos escolher é:
# *) número de palavras terminadas em a, o, e ou s
# *) tamanho médio das palavras utilizadas
# *) uso das stopwords
In [248]:
def document_features(documento):
features={}
for palavra in palavras_escolhidas:
features["contains(%s)"%(palavra,)]=(palavra in documento)
return features
In [254]:
msgsP= [(rr["texto"]["value"],"pos") for rr in msgs[:1000]]
msgsN=[(rr["texto"]["value"],"neg") for rr in msgs[1000:2000]]
msgsT=msgsP+msgsN
random.shuffle(msgsT)
feature_sets=[(document_features(msg[0]),msg[1]) for msg in msgsT]
train_set, test_set = feature_sets[1000:], feature_sets[:1000]
classifier = k.NaiveBayesClassifier.train(train_set)
In [256]:
# testar o classificador e aplicar
In [ ]: